אלגוריתמים חמדנים בעיות ניהול משאבים קידוד Huffman בעיית עץ פורש מינימום פרק 4 ב- Kleinberg/Tardos הרעיון: בונים את הפלט בהדרגה. בכל צעד בוחרים החלטה אופטימלית לאותו הצעד ולא משנים אותה. בדרך כלל זהו רעיון גרוע! 1
בעיית שיבוץ משימות.J כל משימה j J מאופיינת על הקלט: קבוצת משימות.t(j) s(j) וזמן סיום ידי זמן התחלה J J של משימות לא חופפות בזמן, הפלט: תת-קבוצה שהיא מקסימלית בגודלה. ציר הזמן 2
בעיית שיבוץ משימות.J כל משימה j J מאופיינת על הקלט: קבוצת משימות.t(j) s(j) וזמן סיום ידי זמן התחלה J J של משימות לא חופפות בזמן, הפלט: תת-קבוצה שהיא מקסימלית בגודלה. ציר הזמן 2
אלגוריתם החמדן 1. בחר משימה. 2. זרוק את כל המשימות החופפות לה.. אם עדיין יש משימות שלא נבחרו או נזרקו: חזור לצעד מספר 1. מהו כלל בחירה טוב? לפי סדר זמן ההתחלה: לפי משך המשימה: לפי מספר המשימות החופפות:
אלגוריתם החמדן 1. בחר משימה. 2. זרוק את כל המשימות החופפות לה.. אם עדיין יש משימות שלא נבחרו או נזרקו: חזור לצעד מספר 1. מהו כלל בחירה טוב? לפי סדר זמן ההתחלה: לפי משך המשימה: לפי מספר המשימות החופפות:
אלגוריתם החמדן 1. בחר משימה. 2. זרוק את כל המשימות החופפות לה.. אם עדיין יש משימות שלא נבחרו או נזרקו: חזור לצעד מספר 1. מהו כלל בחירה טוב? לפי סדר זמן ההתחלה: לפי משך המשימה: לפי מספר המשימות החופפות:
אלגוריתם החמדן 1. בחר משימה. 2. זרוק את כל המשימות החופפות לה.. אם עדיין יש משימות שלא נבחרו או נזרקו: חזור לצעד מספר 1. מהו כלל בחירה טוב? לפי סדר זמן ההתחלה: לפי משך המשימה: לפי מספר המשימות החופפות:
אלגוריתם החמדן לשיבוץ משימות נבחר לפי סדר זמן הסיום! sort(j,t) while J do next_job first entry in J write(next_job) for every j J s.t. s(j) < t(next_job) do J J {j} end for end while 4
הדגמת הרצה
הדגמת הרצה
הדגמת הרצה
הדגמת הרצה
הדגמת הרצה
הדגמת הרצה
הדגמת הרצה
הדגמת הרצה
הוכחת נכונות קבוצת פלט האלגוריתם וב- Opt את ב- Alg נסמן משימות מקסימלית כלשהי. משפט: Opt Alg = הוכחה לפי סדר עולה של וב- Opt נרשום את המשימות ב- Alg :t ערכי Alg = {i1,i2,i,...,ik} Opt = {j1,j2,j,...,jm} q=1,2,...,k מתקיים נוכיח באינדוקציה שלכל t(iq) t(jq)
המשך ההוכחה בסיס האינדוקציה: = 1,q לפי כלל הבחירה.,q-1 כלומר: נניח נכונות עבור t(iq-1) t(jq-1) שימו לב כי t(jq-1) s(jq) ולכן, כאשר האלגוריתם הוסיף את, iq עדיין לא נזרקה, ולכן, לפי כלל הבחירה t(iq) t(jq) כנדרש. jq,m > k אחרת עכשיו לא ייתכן כי s(jk+1) t(jk) t(ik) וזו סתירה לתנאי הסיום של האלגוריתם. 7
סיבוכיות הזמן החלק ה יקר הוא המיון שלוקח (n. O(n log שאר האלגוריתם ניתן למימוש בזמן O(n). (זאת בהנחה שמיינו פעמיים, גם לפי ערכי.) s 8
בעיית מיזעור האחור הקלט: משימה j J מאופיינת על ידי משך ביצוע p(j) ותאריך יעד d(j). s(j) לכל משימה, כך שהמשימות הפלט: מועד התחלה תתבצענה ללא חפיפה, והאחור המירבי ביחס לתאריך היעד הוא מינימלי. L = maxj L(j) L(j) = max{0,s(j)+p(j)-d(j)} האחור המירבי: ציר הזמן 9
אלגוריתם החמדן למיזעור האחור אפשר להציג פתרון לבעייה כפרמוטציה על המשימות, שתשובצנה בסדר הפרמוטציה בזו אחר זו ללא רווחים. נשתמש בשיבוץ לפי סדר תאריכי היעד: sort(j,d) s(0) 0 for j 1 to J do s(j) = s(j-1) + p(j-1) end for 10
הוכחת נכונות משפט: האלגוריתם מוציא שיבוץ אופטימלי. הוכחה נתבונן בשיבוץ אופטימלי כלשהו, פרמוטציה j1,j2,j,...,jn אם שיבוץ זה שונה מפלט האלגוריתם, אזי יש אינדקס i עבורו d(ji) d(ji+1) 11
המשך ההוכחה אם נחליף את הסדר בין זוג המשימות הללו, לא נגדיל את ערך הפתרון. כדי לראות זאת, נסמן ב- את המשתנים בפתרון השני. לפני אחרי L (ji) = max{0,s(ji+1)+p(ji+1)-d(ji)} max{0,s(ji+1)+p(ji+1)-d(ji+1)} = L(ji+1) L (ji+1) = max{0,s(ji)+p(ji+1)-d(ji+1)} max{0,s(ji+1)+p(ji+1)-d(ji+1)} = L(ji+1) 2 1 1 1 2 2 12
המשך ההוכחה נמשיך להחליף זוגות סמוכים כל עוד הסדר שונה מסדר האלגוריתם. המחיר לא עלה בכל החלפה, כך שמחיר הפתרון של האלגוריתם אינו גדול יותר ממחיר פתרון אופטימלי. סיבוכיות הזמן כמו בבעיית השיבוץ הקודמת, הגורם הדומיננטי הוא זמן המיון, שלוקח n). O(n log 1
בעיית הדיפדוף זיכרון וירטואלי של מחשב מחולק ל דפים. k דפים. למחשב יש זיכרון מטמון שמכיל תוכנית מחשב גדולה ניגשת לסדרה ארוכה של דפים לפי סדר נתון, למשל: a b a b c d a e d b c f d e a b c d e f אם דף אינו במטמון, יש להחליף דף אחר במטמון בדף המבוקש. כמובן ייתכן שהדף שזה עתה החלפנו יידרש בעתיד, ונצטרך להביאו מחדש. רוצים למזער את מספר ההחלפות. 14
הצגה פורמלית של בעיית הדיפדוף הקלט: סדרה סופית P של מספרים חיוביים (מספרי דפים מבוקשים). הפלט: סדרה S של מספרים באורך זהה לאורך הקלט. בסדרה זו, ערך חיובי מציין מספר דף שיש לזרוק מהמטמון, וכל ערך אחר מציין שאין צורך לזרוק דף מהמטמון בצעד זה. הסדרה צריכה להכיל מספר מינימלי של ערכים חיוביים מבין כל הסדרות החוקיות. סדרה היא חוקית אםם לכל צעד i, i המטמון מכיל לכל k דפים. היותר 1
אלגוריתם Belady לבעיית הדיפדוף בכל צעד שדורש החלפה, נזרוק מהמטמון את הדף שיידרש בעתיד הרחוק ביותר (מבין כל הדפים במטמון). 1
מימוש האלגוריתם next(i) שהוא המקום הבא נחשב ערך לכל איבר i ב- P בסדרה שבה מופיע דף זה: for p 1 to #pages do המקום האחרון בו נראה דף last[p] 0 p end for for i 1 to P do next(i) if last[p(i)] > 0 then next(last[p(i)]) i end if last[p(i)] i end for 17
המשך המימוש המטמון cache for i 1 to P do S(i) 0 if P(i) cache and cache = k then S(i) argmax{next(p): p cache} cache cache {S(i)} end if זו פרוצדורה שדורשת מימוש cache cache {P(i)} end for 18
תרגיל בית 1. הוכיחו את נכונות האלגוריתם של.Belady 2. נתחו את סיבוכיות הזמן והמקום. 19
קידוד Huffman.k n תווים מא ב בגודל נתון קובץ ובו קידוד unicode של הקובץ דורש 1n ביטים. קידוד באורך קבוע ידרוש n log k ביטים. כדי לחסוך במקום, נשתמש בקידוד באורך משתנה - תווים שכיחים יותר יקודדו בפחות ביטים מתווים נדירים. לפיענוח קל נדרוש: לכל תו, קידודו איננו רישא של הקידוד של תו אחר. 20
דוגמה בקובץ 100,000 תווים מהא ב {א,ב,ג,ד,ה,ו}. א ב ג ד ה ו סה כ שכיחות 100% % 9% 1% 12% 1% 4% 00,00 0 אורך קבוע 101 100 011 010 001 000 224,00 0 אורך משתנה 1100 1101 111 100 101 0 21
ייצוג הקידוד נייצג את הקידוד על ידי עץ בינארי: העלים יסומנו על ידי התווים. קשת לבן שמאלי תסומן 0. קשת לבן ימני תסומן 1. 0 1 0 1 0 0 1 0 1 0 1 ו ה ד ג ב א העץ המתאים לקוד קבוע ( ביטים) 22
ייצוג הקידוד (המשך) א 0 1 0 1 0 1 0 1 ג ב 0 1 ד ו ה העץ המתאים לקוד אופטימלי 2
ייצוג הקידוד (המשך) טענה: העץ המתאים לקוד אופטימלי הוא תמיד עץ בינארי (כלומר, לכל צומת שאינו עלה יש שני ילדים). מלא נסמן C ב- C את הא ב. C עלים ו- 1- C צמתים פנימיים. לכן בעץ אופטימלי יש מופיע בקובץ. את מספר הפעמים ש- c עבור c C נסמן ב-( f(c ב-( dt(c T נסמן עבור עץ ב- T. את עומק העלה המסומן ב- c B(T) = c C f(c) dt(c) T הוא: המחיר של 24
בניית קידוד Huffman בונים את העץ מלמטה למעלה. 1- C פעולות מיזוג ליצירת העץ עלים ומבצעים מתחילים מ- C הסופי. ו-[ right[x לילד שמאלי וימני, left[x] לכל צומת x נחזיק מצביעים בהתאמה. 2
בניית קידוד Huffman צריך לממש את H במבנה נתונים שמאפשר שליפה מהירה של Huffman(C,f) המינימום, מחיקה והוספה של H C איברים. for i 1 to C -1 do צומת חדש בעץ z left[z] x argmin{f(c): c H} right[z] y argmin{f(c): c H {x}} f(z) f(x) + f(y) H H {x,y} {z} end for האיבר הבודד ב- H return 2
דוגמת הרצה 9 12 1 1 4 27
דוגמת הרצה 9 12 1 1 4 27
דוגמת הרצה 9 12 1 1 4 27
דוגמת הרצה 14 12 1 1 4 9 27
דוגמת הרצה 14 12 1 1 4 9 27
דוגמת הרצה 14 12 1 1 4 9 27
דוגמת הרצה 14 2 1 4 9 12 1 27
דוגמת הרצה 14 2 1 4 9 12 1 27
דוגמת הרצה 14 2 1 4 9 12 1 27
דוגמת הרצה 0 2 4 14 1 12 1 9 27
דוגמת הרצה 0 2 4 14 1 12 1 9 27
דוגמת הרצה 0 2 4 14 1 12 1 9 27
דוגמת הרצה 4 2 0 12 1 14 1 9 27
דוגמת הרצה 4 2 0 12 1 14 1 9 27
דוגמת הרצה 4 2 0 12 1 14 1 9 27
100 דוגמת הרצה 4 2 0 12 1 14 1 9 27
סיבוכיות מימוש פשוט בלולאה מתבצעות 1- C איטרציות. באיטרציה i ה- i מוצאים פעמיים מינימום. מספר הערכים C + 1 - i זמן הריצה: ) 2 O( C מימוש מתוחכם נממש את H על ידי ערמה.(heap) הבנייה: O( C ) מציאת מינימום/הוספה או הורדה של איבר: ( C O(log זמן הריצה: C ) O( C log 28
הוכחת נכונות נראה נכונות באינדוקציה על גודל הא ב C בסיס: א ב בגודל - 2 האלג מקודד כל תו על ידי ביט אחד. צעד האינדוקציה: נניח נכונות עבור א ב בגודל 1- C. אחרי איטרציה אחת, נותרים עם {z}, H = C {x,y} באשר x,y הם התווים עם מספר המופעים המזערי בקובץ, z הוא תו חדש שלא מופיע בא ב, ו-( f(y.f(z) = f(x) + לפי הנחת האינדוקציה, האלג בונה עץ אופטימלי T עבור H. הפלט T הוא העץ T שבו מוסיפים את x,y כילדים של z. 29
הוכחת נכונות (המשך) למה: קיים עץ אופטימלי *T עבורו x,y הם עלים אחים בעומק מירבי ב-* T. הוכחה יהי T עץ קידוד אופטימלי כלשהו עם עלים אחים בעומק מירבי v ובין ל- x u נחליף בין.f(x) וכן ש-( f(y f(u) נניח ש-( f(v.u,v ל- y כדי לקבל את *T. B(T) - B(T*) = c C f(c) dt(c) - c C f(c) dt*(c) = f(x) dt(x) + f(u) dt(u) - f(x) dt*(x) - f(u) dt*(u) + f(y) dt(y) + f(v) dt(v) - f(y) dt*(y) - f(v) dt*(v) = f(x) dt(x) + f(u) dt(u) - f(x) dt(u) - f(u) dt(x) + f(y) dt(y) + f(v) dt(v) - f(y) dt(v) - f(v) dt(y) = (f(u)-f(x)) (dt(u)-dt(x)) + (f(v)-f(y)) (dt(v)-dt(y)) 0 0
הוכחת נכונות (המשך) יהי T העץ *T שבו הסרנו את העלים האחים.x,y נסמן את ההורה שלהם ב- z. זהו עץ קידוד עבור {z} H = C {x,y} לפי הנחת האינדוקציה: B(T*) = B(T ) + f(x) + f(y) B(T ) + f(x) + f(y) = B(T) f(x)dt*(x)+f(y)dt*(y) = (f(x)+f(y)) (dt (z)+1) = f(z)dt (z)+f(x)+f(y) f(x)dt(x) + f(y)dt(y) = (f(x)+f(y)) (dt (z)+1) = f(z)dt (z) + f(x) + f(y) כי 1
עץ פורש מינימום (עפ מ) הקלט: גרף לא מכוון וקשיר G=(V,E), בייצוג של רשימת סמיכויות. משקלות חיוביים על הקשתות w:e N,V V מכיל את כל,G T שהוא תת-גרף של הפלט: עץ והמשקל הכולל של קשתותיו מינימלי. 2
אלגוריתם Kruskal לעפ מ נעבור על הקשתות בסדר לא יורד של משקל. נוסיף לעץ כל קשת שלא סוגרת מעגל בתורה.
Kruskal_MST(G,w) T (V, ) CC {{x}: x V} sort(e,w) for each {x,y} E do if C(x) C(y) then E(T) E(T) {{x,y}} CC CC {C(x),C(y)} {C(x) C(y)} end if end for return T האלגוריתם של Kruskal לעפ מ המשתנה T יחזיק את העץ ההולך ונבנה המשתנה CC יחזיק את הרכיבים הקשירים של T הערך C(x) הוא הרכיב ב- CC שבו נמצא x. 4
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
דוגמת הרצה 2 4 1
הוכחת נכונות S V קבוצה הוא ב- G הגדרה: חתך ב- S. שפת החתך היא קבוצת הקשתות עם קצה אחד {e} שפת החתך. בעץ כל קשת e מגדירה חתך S(e) שעבורו T הוא עפ מ אםם לכל E(T) e ולכל E(G) f בשפת משפט: החתך S(e) מתקיים w(f).w(e) 2 4 1
הוכחת נכונות S V קבוצה הוא ב- G הגדרה: חתך ב- S. שפת החתך היא קבוצת הקשתות עם קצה אחד {e} שפת החתך. בעץ כל קשת e מגדירה חתך S(e) שעבורו T הוא עפ מ אםם לכל E(T) e ולכל E(G) f בשפת משפט: החתך S(e) מתקיים w(f).w(e) 2 e 4 1
הוכחת נכונות S V קבוצה הוא ב- G הגדרה: חתך ב- S. שפת החתך היא קבוצת הקשתות עם קצה אחד {e} שפת החתך. בעץ כל קשת e מגדירה חתך S(e) שעבורו T הוא עפ מ אםם לכל E(T) e ולכל E(G) f בשפת משפט: החתך S(e) מתקיים w(f).w(e) 2 4 e S(e) 1
הוכחת נכונות S V קבוצה הוא ב- G הגדרה: חתך ב- S. שפת החתך היא קבוצת הקשתות עם קצה אחד {e} שפת החתך. בעץ כל קשת e מגדירה חתך S(e) שעבורו T הוא עפ מ אםם לכל E(T) e ולכל E(G) f בשפת משפט: החתך S(e) מתקיים w(f).w(e) 2 4 f e S(e) 1
הוכחת המשפט הרעיון המרכזי: לכל עץ פורש T ולכל E(T) f E(G) יש E(T) e כך ש- (V,E(T) {e} {f}) הוא עץ פורש. בכיוון: עפ מ e מינימלית ב-( S(e. נתון עפ מ T של.G תהי E(T).e נניח שיש E(G) f בשפת החתך S(e) שעבורה w(e).w(f) < אזי העץ הבא: (V,E(T) {e} {f}) פורש את G ומשקלו נמוך יותר מזה של T. לכן זו סתירה להנחה ש- T עפ מ של G. 7
הדגמת ההוכחה 2 4 1 8
הדגמת ההוכחה 2 4 1 8
הדגמת ההוכחה 2 4 1 8
הוכחת המשפט (המשך) נוכיח את הכיוון ההפוך באינדוקציה. נמספר את קשתות T, ונראה שלכל {1- V,...,0,1,2} k, יש עפ מ שמכיל את k הקשתות הראשונות של T. בסיס האינדוקציה: = 0 k, הטענה טריוויאלית. נניח נכונות ל- 1-k. יהי *T עפ מ שמכיל את 1-k הקשתות הראשונות של T אבל לא את הקשת הבאה e. אם נוסיף את e ל-* T, נסגור מעגל C. מעגל זה חייב להכיל קשת f משפת החתך S(e) (לפי T). לפי הגדרת,S(e) לא ייתכן כי E(T) f. לכן, אם נוסיף ל-* T את e ונסיר את f, נקבל עץ כנדרש שמשקלו אינו גדול יותר ממשקל *T. 9
הדגמת ההוכחה 2 2 4 11 T 40
הדגמת ההוכחה 2 2 4 11 T T* 40
הדגמת ההוכחה 2 2 4 11 T T* 40
הדגמת ההוכחה 2 2 4 11 T T* 40
סיבוכיות האלגוריתם של Kruskal מיון הקשתות: E ). O( E log על ידי מבנה נתונים ל- union/find. CC מימוש מספר האיברים: V. אנחנו מבצעים E 2 פעולות,find ופחות מ- V פעולות.union נסתפק במימוש פשוט של.union/find הזמן הכולל לביצוע הפעולות הוא: V ). O( E log.( קשיר, אז E V -1 סיבוכיות הזמן: E ) G) O( E log 41
סכמה כללית לאלגוריתמים חמדנים לחישוב עפ מ 1. (איתחול) כל הקשתות לא צבועות. 2. אם בכל שפת חתך יש קשת כחולה ובכל מעגל יש קשת אדומה, עוצרים.. אחרת, מפעילים את אחד הכללים הבאים: הכלל הכחול: בשפת חתך שבה אין קשת כחולה, צובעים בכחול קשת קלה ביותר שאינה צבועה. הכלל האדום: במעגל שאין בו קשת אדומה, צובעים באדום קשת כבדה ביותר שאינה צבועה. 4. חוזרים ל- 2. 42
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
דוגמת הרצה 2 4 1 4
הוכחות משפט: בסיום התהליך כל הקשתות צבועות ותת-הגרף הנפרש על ידי הקשתות הכחולות הוא עץ פורש מינימום. למה: אחרי צביעת k קשתות, יש עפ מ שמכיל את כל הקשתות הכחולות ואף קשת אדומה. 44
הוכחות הלמה: אינדוקציה על k. הבסיס הוא 0=k. אין קשתות הוכחת צבועות, ולכן הטענה בוודאי נכונה. צעד האינדוקציה: נניח שצבענו את הקשתות,ek-1 e1,e2,... והטענה התקיימה, כלומר יש עפ מ T שמכיל את כל הקשתות הכחולות עד עתה ואף קשת אדומה עכשיו צובעים את הקשת (u,v). ek = מקרה א: הקשת נצבעת בכחול. כלומר, הכלל הכחול הופעל על חתך ש- ek בשפתו. ב- T יש מסלול מ- u ל- v. מסלול זה חייב לחצות את החתך לפחות פעם אחת, והקשת החוצה e לא צבועה באדום (כי אין קשת אדומה ב- T ) או בכחול (כי שפת החתך לא מכילה קשתות כחולות). אבל אז, לפי הכלל הכחול, משקל ek אינו גדול ממשקל e ולכן אפשר להחליף ביניהן ולקבל עפ מ T שמכיל גם את. ek 4
הוכחות מקרה ב: הקשת נצבעת באדום. כלומר, הכלל האדום הופעל על מעגל C שמכיל את הקשת. ek נניח ש- T מכיל את הקשת הזו. נתבונן בחתך S(ek), המוגדר על פי T. המעגל C חוצה את החתך לפחות עוד פעם אחת בקשת. e קשת זו אינה צבועה כחול (אחרת T מכיל מעגל). היא גם אינה צבועה אדום (כי C אינו מכיל קשתות אדומות). לכן משקל e לכל היותר כמשקל, ek לכן אפשר להחליף ביניהן ולקבל עפ מ T שאינו מכיל את. ek 4
הוכחות הוכחת המשפט: על פי הלמה, בכל שלב הקשתות הכחולות פורשות יער (שיכול לכלול צמתים מבודדים). נניח שנותרה קשת e מחברת שני עמים כחולים, אז חתך המפריד אם.e לא צבועה ביניהם אינו כולל קשתות כחולות, ולכן אפשר להפעיל עליו את ה e סוגרת מעגל ששאר קשתותיו כחולות, אזי היא כלל הכחול. אם חייבת להיות קשת כבדה ביותר במעגל זה, ולכן אפשר לצבוע אותה באדום לפי הכלל האדום. 47
מטרואידים ואלגוריתם החמדן הגדרה: זוג סדור (S,I) הוא מטרואיד אםם S קבוצה S לא ריקה של תת-קבוצות של קבוצה ו- I סופית המקיימת:.1 אם A I אזי לכל,B A גם.B I (ירושה) x A B כך אזי יש, A > ו- B.2 אם A,B I.B {x} I (החלפה) שמתקיים קבוצות בלתי-תלויות. כל איבר מקסימלי איברי I מכונים בסיס. ביחס להכלה נקרא 48
דוגמאות S היא קבוצת השורות של מטריצה. קבוצת הקבוצה אםם איברי A בת ל. נמצאת ב- I A שורות S היא קבוצת הקשתות של גרף. קבוצת הקבוצה A תת-הגרף המושרה ע י אםם ב- I קשתות A נמצאת אינו מכיל מעגל פשוט. 49
אלגוריתם החמדן נתונה פונקציית משקל. w:s R אלגוריתם החמדן מנסה למצוא קבוצה I ב- I בעלת משקל כולל מירבי. Greedy(S,w) A while x S, A {x} I do x argmax{w(x): x S A {x} I} A A {x} end while return A 0
משפט Rado-Gale-Edmonds תהי I קבוצה לא ריקה של תת-קבוצות של S שמקיימת את תכונת הירושה:.A B I A I אלגוריתם החמדן מוצא, לכל פונקציית משקל חיובית w, קבוצה A I בעלת משקל כולל מירבי אםם (S,I) מטרואיד. 1
הוכחת המשפט בכיוון: מטרואיד אלג החמדן אופטימלי. נניח בשלילה שהטענה לא נכונה. יהיו a1,a2,a,...,am האיברים בפלט האלג בסדר לא עולה של משקל, ו- b1,b2,b,...,bn האיברים בפתרון אופטימלי כלשהו באותו סדר. יהי k האינדקס הראשון עבורו w(ak). w(bk) > {a1,a2,...,ak-1}, {b1,b2,...,bk} I לכן קיים i k 1 עבורו {a1,a2,...,ak-1} bi ו-.{a1,a2,...,ak-1,bi} I זו סתירה לבחירה של האלג החמדן ב-. ak 2
הוכחת המשפט (המשך) בכיוון: אלג חמדן אופטימלי מטרואיד. נניח בשלילה שהטענה לא נכונה. אזי יש קבוצות {a1,a2,a,...,am}, {b1,b2,b,...,bn} I עבורן,m < n אבל לכל {1,2,...,n},i.{a1,a2,a,...,am,bi} I אלגוריתם החמדן ייכשל עם פונקציית המשקל w(a) = m + 2, a {a1,a2,a,...,am}; w(b) = m + 1, b {b1,b2,b,...,bn} {a1,a2,a,...,am}; w(c) = 0, otherwise.
תרגיל בית 1. נתונים n מערכים ממויינים של מספרים טבעיים באורכים שונים. מיזוג של שני מערכים באורך a ו- b יוצר מערך ממויין אחד באורך a+b בזמן.O(a+b) תנו אלגוריתם לחישוב סדר אופטימלי של מיזוגים של זוגות מערכים (כולל תוצאות ביניים) ליצירת מערך ממויין אחד מכל n מערכי הקלט. 2. הוכיחו את נכונות האלגוריתם של Kruskal על סמך משפט.Rado-Gale-Edmonds 4